﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using ChampionFramework.Models;

namespace ChampionFramework.Controllers
{
	public class JogoGrupoController : Controller
	{
		private ChampionContextContainer db = new ChampionContextContainer();

		public ActionResult Create(int id = 0)
		{
			this.LoadSelectLists(id);
			return View();
		}

		private void LoadSelectLists(int grupoId)
		{
			Grupo grupo = db.GrupoSet.Single(g => g.Id == grupoId);
			ViewBag.TimeVisitanteId = new SelectList(grupo.Time, "Id", "Nome");
			ViewBag.TimeMandanteId = new SelectList(grupo.Time, "Id", "Nome");
			ViewBag.GrupoId = new SelectList(db.GrupoSet.Where(g => g.Id == grupoId), "Id", "Nome");
			ViewBag.GrupoIdLink = grupoId;
		}

		[HttpPost]
		public ActionResult Create(JogoGrupo jogoGrupo)
		{
			int timeVisitanteId = Convert.ToInt32(this.Request.Params["TimeVisitanteId"]);
			int timeMandanteId = Convert.ToInt32(this.Request.Params["TimeMandanteId"]);
			int grupoId = Convert.ToInt32(this.Request.Params["GrupoId"]);
			if (timeMandanteId == timeVisitanteId)
			{
				this.LoadSelectLists(grupoId);
				throw new Exception("Os times partipantes do jogo devem ser diferentes");
			}
			jogoGrupo.GetReadyForCreating(db, timeMandanteId, timeVisitanteId);
			if (ModelState.IsValid)
			{
				db.JogoSet.AddObject(jogoGrupo);
				db.SaveChanges();
				return RedirectToAction("Details", "Grupos", new { id = grupoId });
			}
			this.LoadSelectLists(grupoId);
			return View();
		}

		public ActionResult EscalarTimes(int id = 0)
		{
			this.LoadSelectListsEscalacao(id);
			return View();
		}

		private void LoadSelectListsEscalacao(int jogoGrupoId)
		{
			ViewBag.JogoGrupoId = jogoGrupoId;
			JogoGrupo jogoGrupo = db.JogoSet.OfType<JogoGrupo>().Single(j => j.Id == jogoGrupoId);
			var jogadoresMandante = jogoGrupo.GetEscalacaoMandante().Time.Jogador.Take(18).ToList();
			var jogadoresVisitante = jogoGrupo.GetEscalacaoVisitante().Time.Jogador.Take(18).ToList();
			ViewBag.JogadoresMandante = jogadoresMandante;
			ViewBag.JogadoresVisitante = jogadoresVisitante;
		}

		[HttpPost]
		public ActionResult EscalarTimes()
		{
			int jogoGrupoId = Convert.ToInt32(this.Request.Params["JogoGrupoId"]);
			JogoGrupo jogoGrupo = db.JogoSet.OfType<JogoGrupo>().Single(j => j.Id == jogoGrupoId);
			db.JogoSet.Attach(jogoGrupo);
			for (int i = 0; i < 11; i++)
			{
				int jogadorId = Convert.ToInt32(this.Request.Params[String.Format("JogadoresTitularesMandante{0}", i)]);
				Jogador jogador = db.JogadorSet.Single(j => j.Id == jogadorId);
				jogoGrupo.GetEscalacaoMandante().JogadorTitular.Add(jogador);
				db.ObjectStateManager.ChangeObjectState(jogoGrupo, EntityState.Modified);
			}
			for (int i = 0; i < 7; i++)
			{
				int jogadorId = Convert.ToInt32(this.Request.Params[String.Format("JogadoresReservasMandante{0}", i)]);
				Jogador jogador = db.JogadorSet.Single(j => j.Id == jogadorId);
				jogoGrupo.GetEscalacaoMandante().JogadorReserva.Add(jogador);
				db.ObjectStateManager.ChangeObjectState(jogoGrupo, EntityState.Modified);
			}
			for (int i = 0; i < 11; i++)
			{
				int jogadorId = Convert.ToInt32(this.Request.Params[String.Format("JogadoresTitularesVisitante{0}", i)]);
				Jogador jogador = db.JogadorSet.Single(j => j.Id == jogadorId);
				jogoGrupo.GetEscalacaoVisitante().JogadorTitular.Add(jogador);
				db.ObjectStateManager.ChangeObjectState(jogoGrupo, EntityState.Modified);
			}
			for (int i = 0; i < 7; i++)
			{
				int jogadorId = Convert.ToInt32(this.Request.Params[String.Format("JogadoresReservasVisitante{0}", i)]);
				Jogador jogador = db.JogadorSet.Single(j => j.Id == jogadorId);
				jogoGrupo.GetEscalacaoVisitante().JogadorReserva.Add(jogador);
				db.ObjectStateManager.ChangeObjectState(jogoGrupo, EntityState.Modified);
			}
			db.SaveChanges();
			this.LoadSelectListsEscalacao(jogoGrupoId);
			return RedirectToAction("../Grupos/Details/" + jogoGrupoId);
		}

		protected override void Dispose(bool disposing)
		{
			db.Dispose();
			base.Dispose(disposing);
		}
	}
}